﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SortGUI
{
    public class InsertSort : SortBase
    {

        override public void Sort(int[] alNum)

        {
            //初始化
            Initialize();
            // 实现插入排序算法,i代表未排序的,j代表排序完成的
            for (int i = 1; i < alNum.Length; i++)//i= 0已经默认为排好顺序的
            {
                int key = alNum[i];//将待插入元素复制
                for (int j = i - 1; j >= 0; j--)//从后往前查找待插入的位置
                {
                    lastSwappedIndices[0] = j;
                    lastSwappedIndices[1] = j + 1;
                    if (alNum[j] > key)//发生交换
                    {
                        Swap(ref alNum[j], ref alNum[j + 1]);
                        // 发生了交换，所以只更新到交换发生的索引
                        lastSortedIndex = Math.Max(lastSortedIndex, lastSwappedIndices[1]);
                    }
                    else//没有发生交换
                    {
                        lastSortedIndex = alNum.Length - i;
                        break;
                    }
                    count++;
                    SortNextStep();
                }
            }

            //排序完成
            Complete();
        }

        public override void Initialize()
        {
            count = 0;
            updataColor(isInitialize = false);
        }


        public override void SortNextStep()
        {
            updateUiCallback(count, lastSwappedIndices, lastSortedIndex = 10000, swapped); // 更新UI
        }

        public override void Complete()
        {
            updateUiCallback(count, lastSwappedIndices, lastSortedIndex - 10000, swapped);
        }
    }
}
